/***************************************************************************
 *   Copyright (C) 2009 by Marian Skvarek   *
 *   skvarek.marian@gmail.com   *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A TrackICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
#include "CTabGenerator.h"
#include "CPartGuitar.h"
#include "CPositionList.h"
#include "CSymbol.h"
#include "CNoteGroup.h"

#include <QLinkedList>

using namespace easyscore::core;

namespace easyscore
{
    namespace components
    {

        CTabGenerator::CTabGenerator()
        {
        }


        CTabGenerator::~CTabGenerator()
        {
        }

        bool CTabGenerator::generateTablature(CPartGuitar *part)
        {
            QLinkedList<CSymbol*> symbols = part->getTrack().getSymbols();

            CPositionList curr;
            curr.ones();

            QLinkedList<CNoteGroup*> currNotes;
            foreach(CSymbol *symbol, symbols)
            {
                if(symbol->isRest())
                {
                    CNoteGroup *noteGroup = (CNoteGroup *)symbol;
                    CPositionList sPL = noteGroup->getPositionList();

                    CPositionList currBackup = curr;

                    curr.andIt(sPL);

                    if(curr.isEmpty())
                    {
                        setTablature(currNotes,currBackup);
                        currNotes.clear();
                        curr = sPL;
                    }
                    else
                    {
                        currNotes.append(noteGroup);
                    }
                }
            }

            return true;
        }

        //Protected methods
        void CTabGenerator::setTablature(QLinkedList<CNoteGroup *> noteGroups,CPositionList list)
        {
            foreach(CNoteGroup *gr, noteGroups)
            {
                gr->setTablature(list.getFirstNonZero());
            }
        }

    }
}
